using System.Collections.Generic;

namespace NopSolutions.NopCommerce.BusinessLogic.Regions
{
    /// <summary>
    /// Region service
    /// </summary>
    public partial interface IRegionService
    {
        /// <summary>
        /// Marks a region as deleted
        /// </summary>
        /// <param name="regionId">Region identifer</param>
        void MarkRegionAsDeleted(int regionId);

        /// <summary>
        /// Gets all regions
        /// </summary>
        /// <returns>Region collection</returns>
        List<Region> GetAllRegions();

        /// <summary>
        /// Gets all regions
        /// </summary>
        /// <param name="showHidden">A value indicating whether to show hidden records</param>
        /// <returns>Region collection</returns>
        List<Region> GetAllRegions(bool showHidden);

        /// <summary>
        /// Gets a Region
        /// </summary>
        /// <param name="regionId">Region identifier</param>
        /// <returns>Region</returns>
        Region GetRegionById(int regionId);

        /// <summary>
        /// Inserts a region
        /// </summary>
        /// <param name="region">Region</param>
        void InsertRegion(Region region);

        /// <summary>
        /// Updates the region
        /// </summary>
        /// <param name="region">Region</param>
        void UpdateRegion(Region region);

        /// <summary>
        /// Gets localized region by id
        /// </summary>
        /// <param name="regionLocalizedId">Localized region identifier</param>
        /// <returns>region content</returns>
        RegionLocalized GetRegionLocalizedById(int regionLocalizedId);

        /// <summary>
        /// Gets localized region by region id
        /// </summary>
        /// <param name="regionId">region identifier</param>
        /// <returns>Region content</returns>
        List<RegionLocalized> GetRegionLocalizedByRegionId(int regionId);

        /// <summary>
        /// Gets localized region by region id and language id
        /// </summary>
        /// <param name="regionId">Region identifier</param>
        /// <param name="languageId">Language identifier</param>
        /// <returns>Region content</returns>
        RegionLocalized GetRegionLocalizedByRegionIdAndLanguageId(int regionId, int languageId);

        /// <summary>
        /// Inserts a localized Region
        /// </summary>
        /// <param name="RegionLocalized">Region content</param>
        void InsertRegionLocalized(RegionLocalized regionLocalized);

        /// <summary>
        /// Update a localized Region
        /// </summary>
        /// <param name="RegionLocalized">Region content</param>
        void UpdateRegionLocalized(RegionLocalized regionLocalized);

        /// <summary>
        /// Deletes a product Region mapping
        /// </summary>
        /// <param name="productRegionId">Product Region mapping identifer</param>
        void DeleteProductRegion(int productRegionId);

        /// <summary>
        /// Gets product Region collection
        /// </summary>
        /// <param name="RegionId">Region identifier</param>
        /// <returns>Product Region collection</returns>
        List<ProductRegion> GetProductRegionsByRegionId(int regionId);

        /// <summary>
        /// Gets a product Region mapping collection
        /// </summary>
        /// <param name="productId">Product identifier</param>
        /// <returns>Product Region mapping collection</returns>
        List<ProductRegion> GetProductRegionsByProductId(int productId);

        /// <summary>
        /// Gets a product Region mapping 
        /// </summary>
        /// <param name="productRegionId">Product Region mapping identifier</param>
        /// <returns>Product Region mapping</returns>
        ProductRegion GetProductRegionById(int productRegionId);

        /// <summary>
        /// Inserts a product Region mapping
        /// </summary>
        /// <param name="productRegion">Product Region mapping</param>
        void InsertProductRegion(ProductRegion productRegion);

        /// <summary>
        /// Updates the product Region mapping
        /// </summary>
        /// <param name="productRegion">Product Region mapping</param>
        void UpdateProductRegion(ProductRegion productRegion);
    }
}
